package scu.maqiang.eigenvalue;

import scu.maqiang.numeric.SRMatrix;

public class MarkovEigenvalue {
    public static void main(String[] args) {
        SRMatrix A = markov(6);
        System.out.println(A);
    }

    public static SRMatrix markov(int m) {
        int pos = 0;
        int n = (m + 1) * (m + 2) / 2;
        SRMatrix A = new SRMatrix(n);
        for(int i = 0; i <= m; i++) {
            for(int j = 0, jmax = m - i; j <= jmax; j++) {
                System.out.println(pos);
                double pd = 0.5 * (i + j) / m;
                if (j - 1 >= 0) {
                    if (i == 0 || j == 0) {
                        A.setElement(pos, pos - 1, 2 * pd);
                    } else {
                        A.setElement(pos, pos - 1, pd);
                    }
                }
                if (i - 1 >= 0) {
                    if (i == 0 || j == 0) {
                        A.setElement(pos, pos - jmax - 2, 2 * pd);
                    } else {
                        A.setElement(pos, pos - jmax - 2, pd);
                    }
                }

                double pu = 0.5 - pd;
                if (j + 1 <= jmax) {
                    A.setElement(pos, pos + 1, pu);
                }
                if (i + 1 <= m) {
                    A.setElement(pos, pos + jmax + 1, pu);
                }
                pos++;
            }
        }
        return A;
    }
}
